package com.jframe.sys.utils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @author l2iu11
 *
 */
public class StringUtil {
	
	/**
	 * 获取项目绝对路径
	 * 
	 * @return
	 */
	private static String prjAbsolutePath = null;

	
	
	/**
	 * 将空字符串转换为"",避免出现字符串的空指针异�?
	 * @param str
	 * @return
	 */
	public static String null2Space(String str){
		
		if(str == null||str.isEmpty()||str.equals("null")){
			return "";
		}
		return str;
	}	
	
	/**
	 * 过滤为空的对象并返回""
	 * @param obj
	 * @return
	 */
	public static String null2Space(Object obj) {

		if (obj == null || obj.equals("null")) {
			return "";
		}
		return obj.toString().trim();
	}
	
	/**
	 * 判断字符串是否为空
	 * @param str
	 * @return
	 */
	public static boolean isStringNull(String str){
		if(str == null||str.isEmpty()||str.equals("null")){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 判断字对象是否为空
	 * @param obj
	 * @return
	 */
	public static boolean isObjectNull(Object obj){
		if (obj == null || obj.equals("null")||obj=="") {
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 获取子串，并将null转为""
	 * @param str
	 * @param beginIndex
	 * @return
	 */
	public static String subString(String str, int beginIndex) {
		
		str = null2Space(str);
		if (str.length() > beginIndex&&str.length()>beginIndex)
			return str.substring(beginIndex);		
		return "";
	}

	
	/**
	 * 获取子串，并将null转为""
	 * @param str
	 * @param beginIndex
	 * @param endIndex
	 * @return
	 */
	public static String subString(String str, int beginIndex, int endIndex) {
		
		str = null2Space(str);
		if (beginIndex > endIndex)
			return "";
		int len = str.length();
		if (endIndex <= len)
			return str.substring(beginIndex, endIndex);
		else if (beginIndex <= len)
			return str.substring(beginIndex);		
		return "";
	}
	
	/**
	 * 函数名称：parseInt 函数功能：把数字字符串转换为整形
	 * 
	 * @param str
	 *            待转换的字符�?
	 * @return 如果为数字字符串转换为数字，否则返回0�?
	 */
	public static int parseInt(Object obj) {

		return obj == null ? 0 : parseInt(obj.toString());
	}

	public static int parseInt(String str) {
		try {
			if (isDigit(str)) {
				return Integer.parseInt(str);
			} else {
				return 0;
			}

		} catch (Exception ex) {
			ex.printStackTrace();
			return 0;
		}
	}
	
	public static boolean parseBoolean(Object obj) {
		boolean b = false;
		try {
			if (obj != null) {
				b = (Boolean) obj;
			}
		} catch (Exception e) {

		}
		return b;
	}

	public static boolean parseBoolean(String str) {

		return "true".equalsIgnoreCase(str);
	}

	public static long parseLong(Object str) {
		return parseLong(str.toString());
	}

	public static long parseLong(String str) {
		try {
			if (isDigit(str)) {
				return Long.parseLong(str);
			} else {
				return 0;
			}

		} catch (Exception ex) {
			return 0;
		}
	}

	public static double parseDouble(String str) {
		try {
			return Double.parseDouble(str);
		} catch (Exception ex) {
			return 0;
		}
	}

	public static float parseFloat(String str) {
		try {
			return Float.parseFloat(str);
		} catch (Exception ex) {
			return 0;
		}
	}

	public static char parseChar(String str) {
		try {
			return str != null && str.length() > 0 ? str.charAt(0) : 0;
		} catch (Exception ex) {
			return 0;
		}

	}
	
	/**
	 * 函数名称：isNums 函数功能：判断一个字符串是否是数�?
	 * 
	 * @param str1
	 *            字符�?
	 * @exception IsDigit
	 *                返回false *
	 * @return 是数字，则返回true
	 */
	public static boolean isDigit(String str) {
		try {
			char cCheck;
			if (str == null || "".equals(str))
				return false;
			for (int i = 0; i < str.length(); i++) {
				cCheck = str.charAt(i);
				if (!isDigit(cCheck)) {
					return false;
				}
			}
			return true;
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		}
	}
	
	/**
	 * 函数名称：strToArray 函数功能：判断一个字节是否在0�?之间
	 * 
	 * @param cCheck
	 *            字节
	 * @exception IsDigit
	 *                返回false
	 * @throws IsDigit
	 *             �?
	 * @see isNums
	 * @return �?�?之间，则返回true
	 */
	public static boolean isDigit(char digit) {
		return (('0' <= digit) && (digit <= '9'));
	}
	
	public static String initLetterToUpperCase(String str) {

		return str.substring(0, 1).toUpperCase() + str.substring(1);
	}

	public static String initLetterToLowerCase(String str) {

		return str.substring(0, 1).toLowerCase() + str.substring(1);
	}
	
	/**
	 * 全部替换字符串里符合指定内容的为其它内容，与String类中不同，它使用的不是正则表达式的。
	 * 
	 * @param String
	 *            regex, 需要替换的内容
	 * @param String
	 *            replacement, 用来替换的内容
	 * @return String, 字符串替换后的内容
	 */
	public static String replaceAll(String str, String regex, String replacement) {
		if (str == null || regex == null) {
			return str;
		}
		if (str.equals("") || regex.equals("")) {
			return str;
		}
		StringBuffer sb = new StringBuffer();
		int rbegin = 0;
		int rend = str.indexOf(regex);
		int rlen = regex.length();
		while (rend >= 0) {
			sb.append(str.substring(rbegin, rend));
			sb.append(replacement);
			rbegin = rend + rlen;
			rend = str.indexOf(regex, rbegin);
		}
		sb.append(str.substring(rbegin));
		str = sb.toString();
		return str;
	}
	
	/**
	 * 函数名称：replace 函数功能：字符替换，可以把指定字符串的的一个旧字符串换成新的字符串
	 * 
	 * @param sList
	 *            要替换的字符串
	 * @param oldString
	 *            要被替换的字串
	 * @param newString
	 *            新的字串
	 * @return 返回替换後的结果
	 */
	public static String replace(String sList, String oldString,
			String newString) {
		if (sList == null || oldString == null) {
			return sList;
		}
		if (sList.equals("") || oldString.equals("")) {
			return sList;
		}
		newString = null2Space(newString);
		return sList.replace(oldString, newString);
	}	
	
	public static String getPrjAbsolutePath() {
		if (prjAbsolutePath != null)
			return prjAbsolutePath; //

		String url = "";
		try {
			url = Thread.currentThread().getContextClassLoader()
					.getResource("").toURI().getPath();
			if("\\".equals(File.separator)){
				url = url.substring(1, url.indexOf("WEB-INF"));
			}
			else {
				url = url.substring(0, url.indexOf("WEB-INF"));
			}
		} catch (URISyntaxException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			url = StringUtil.class.getClassLoader().getResource("")
					.toString();
		}
		String reg = "file:(.+)WEB-INF";

		Matcher mat = Pattern.compile(reg, 2).matcher(url);
		if (mat.find()) {
			String path = mat.group(1);
			path = path.replaceAll("/", "\\" + File.separator);
			if (File.separator.equals("\\")) {
				prjAbsolutePath = path.substring(1);
			}
			path = StringUtil.replaceAll(path, "%20", " ");
			try {
				path = java.net.URLDecoder.decode(path, "utf-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			prjAbsolutePath = path;
		} else {
			prjAbsolutePath = url;

		}
		prjAbsolutePath = StringUtil.replaceAll(prjAbsolutePath, "%20", " ");
		return prjAbsolutePath;
	}
	
	/**
	 * 函数名称：split 函数功能：分割字符串的函数
	 * 
	 * @param sList
	 *            待分割的字串
	 * @param splitChar
	 *            分割标志串
	 * @param result
	 *            存放结果的数组指针
	 * @return 分割後数组中的元素个数
	 */
	public static int split(String sList, String splitChar, String result[]) {

		if (sList == null || sList.equals("") || splitChar == null
				|| splitChar.equals("")) {
			result[0] = sList;
			return 1;
		}
		int stringAtLocal = sList.indexOf(splitChar);
		int startLocal = 0;
		int resultCount = 1;
		while (stringAtLocal >= 0) {
			result[resultCount - 1] = sList
					.substring(startLocal, stringAtLocal);
			startLocal = stringAtLocal + splitChar.length();
			stringAtLocal = sList.indexOf(splitChar, startLocal);
			resultCount++;
		}
		result[resultCount - 1] = sList.substring(startLocal, sList.length());
		return resultCount;
	}

	/**
	 * 对字符串按“|”分割成数组，与String.split按正则表达式进行分割不同，不方法适合于不太长的字符串
	 * 
	 * @param str
	 * @param splitChar
	 * @return
	 */
	public static String[] split(String str, String splitChar) {

		str = null2Space(str);
		if (str == null || str.equals("") || splitChar == null
				|| splitChar.equals("")) {
			return new String[] { "" };
		}
		if (str.indexOf(splitChar) >= 0) {

			List<String> ls = new ArrayList<String>();
			int stringAtLocal = str.indexOf(splitChar);
			int startLocal = 0;
			while (stringAtLocal >= 0) {
				ls.add(str.substring(startLocal, stringAtLocal));
				startLocal = stringAtLocal + splitChar.length();
				stringAtLocal = str.indexOf(splitChar, startLocal);
			}
			ls.add(str.substring(startLocal, str.length()));
			String[] result = new String[ls.size()];
			int i = 0;
			for (String s : ls) {
				result[i++] = s;
			}
			return result;
		} else {
			return new String[] { str };
		}

	}
	
	/**
	 * 函数名称：encrypt 函数功能：加密
	 * 
	 * @param str
	 *            待转换的字符串
	 * @return 转换後的字串
	 */
	public static String encrypt(String str) {
		try {
			return (new DesEncrypt()).encrypt(str);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return str;
		}

	}

	/**
	 * 函数名称：encrypt 函数功能：解密
	 * 
	 * @param str
	 *            待转换的字符串
	 * @return 转换後的字串
	 */
	public static String decrypt(String str) {
		try {
			return (new DesEncrypt()).decrypt(str);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return str;
		}
	}

	public static String[] split(String str) {

		return split(str, ",");
	}
	
	/**
	 * 函数名称：getNumToInt 函数功能：把一个数字字符串转变为整型 例:034-->34,23.3--->23,0023.4--23
	 * 
	 * @param str1
	 *            数字字符串
	 * @exception IsDigit
	 *                返回-1 *
	 * @return 是数字，则返回整型，否则返回-1
	 */
	public static int getNumToInt(String str1) {
		try {
			if (str1 == null || "".equals(str1)) {
				str1 = "0";
			}
			int flag = 0; //
			String tmpStr = "";
			char cCheck;
			for (int i = 0; i < str1.length(); i++) {
				cCheck = str1.charAt(i);
				if (!isDigit(cCheck)) {
					break;
				}
				if (cCheck != '0') {
					flag = 1;
				}
				if (cCheck == '0' && flag == 0) {
					continue;
				}
				tmpStr += String.valueOf(cCheck);
			}
			// ���紫�����Ϊ��0������tmpStr��ʱΪ��
			if ("".equals(tmpStr)) {
				tmpStr = "0";
			}
			return Integer.parseInt(tmpStr);
		} catch (Exception ex) {
			return -1;
		}
	}
	
	/**
	 * 函数名称：strToArray 函数功能:根据分割符把字符串列表分割,并存入到数组
	 * 
	 * @param sList
	 *            用分割符隔开的字符串列表
	 * @param splitChar
	 *            分割符
	 * @return 数组
	 */
	public static String[] strToArray(String sList, String splitChar) {
		if (sList == null) {
			return null;
		}
		int iCount = getCharNum(sList, splitChar); // splitChar�ĸ���
		if (iCount == -1) {
			return null;
		}
		iCount++;
		int StringAtLocal = sList.indexOf(splitChar); // ���ַ�Ŀ�ʼλ��
		int StartLocal = 0; // �����滻�Ŀ�ʼ��Χ
		String[] aResult = new String[iCount];
		if (iCount == 1) {
			StringAtLocal = sList.length();
		}
		aResult[0] = sList.substring(StartLocal, StringAtLocal);
		for (int i = 1; i < iCount; i++) {
			StartLocal = StringAtLocal + splitChar.length();
			StringAtLocal = sList.indexOf(splitChar, StartLocal);
			if (StringAtLocal == -1) {
				StringAtLocal = sList.length();
			}
			aResult[i] = sList.substring(StartLocal, StringAtLocal);
		}
		return aResult;
	}
	
	/**
	 * 函数名称：getCharNum 函数功能:取得分割符的个数
	 * 
	 * @param sList
	 *            用分割符隔开的字符串列表
	 * @param splitChar
	 *            分割符
	 * @return 分割符的个数
	 */
	public static int getCharNum(String sList, String splitChar) {
		// ���û�д���Դ����ָ��־��(splitChar)���򷵻�-1
		if (sList == null || sList.equals("") || splitChar == null
				|| splitChar.equals("")) {
			return -1;
		}
		int StringAtLocal = sList.indexOf(splitChar); // ���ַ�Ŀ�ʼλ��
		int StartLocal = 0; // �����滻�Ŀ�ʼ��Χ
		int iCount = 0; // �ָ�����ļ�����
		while (StringAtLocal >= 0) {
			StartLocal = StringAtLocal + splitChar.length();
			StringAtLocal = sList.indexOf(splitChar, StartLocal);
			iCount++;
		}
		return iCount;
	}
	
	/**
	 * 获取长度为length的随机字符串
	 * @param length(字符长度)
	 * @return
	 */
	public static String getRandomString(int length) { 
	    StringBuffer buffer = new StringBuffer("ixbO8aQPEuKLFj0vIJyCDr6ZcWsdUV1nYo2Skl3mzAwGH9MNh7gTRBp4qt5Xef"); 
	    StringBuffer sb = new StringBuffer(); 
	    Random r = new Random(); 
	    int range = buffer.length(); 
	    for (int i = 0; i < length; i ++) { 
	        sb.append(buffer.charAt(r.nextInt(range))); 
	    } 
	    return sb.toString(); 
	}

	public static String trimAll(String dir){
		return dir.trim();
	}
	
	/**
	 * 处理掉sql条件中的除空格外的第一个单词
	 * @param str
	 * @return
	 */
	public static String removeBeginStr(String str){
		String[] strs = str.split(" ");
		StringBuffer temp = new StringBuffer();
		int j=0;//非空格字符串计数器
		for(int i=0;i<strs.length;i++){
			String strTemp = strs[i];
			if(!strTemp.equals("")&&!strTemp.equals(" ")&&strTemp!=null){
				j++;
			}
			if(j>1){
				temp.append(strTemp+" ");
			}
		}		
		return temp.toString();
	}
	
	public static void main(String args[]){
		System.out.println(encrypt("meiya"));
		//84b6bfce079df9ef
		
		//String conditions = "and a=b and b=c ";
		
//		String[] strs = conditions.split(" ");
//		StringBuffer temp = new StringBuffer();
//		int j=0;//非空格字符串计数器
//		for(int i=0;i<strs.length;i++){
//			String str = strs[i];
//			if(!str.equals("")){
//				j++;
//			}
//			if(j>1){
//				temp.append(str+" ");
//			}
//		}
		//
		//System.out.println(removeBeginStr(conditions));
	    //System.out.println(MacAddrUtil.getMacAddress("127.0.0.1"));
		//String key = Yz.createLicense(MacAddrUtil.getMacAddress("127.0.0.1"), "2024-01-01");
		//81c64b3180bfb42b8d03ea16f3dd69c21428731ef4698c675f6e0b120bf1ff2ea0d8ad922e952b1a8af33f0b88e65f1168d99fffc030ded07b2728cf31c9f1dc44f57388b82971bdaee02161f7533bcb2bcaaafd9e963d292b6bb43009933ee4bf035113feaa661338498928e51daee10f52aaaf11b0c8deb83cb1260fe47f1a7629011a671a3369a7d68f57484ce44f0b6adc3821eeaaad7be31cb9fa5d9003264a43b69a3ea6f98ace7f0373a2d245a74d2b51ae3a69a78dc8e58f40db890d8d7ff70fb2612dd58c12defc2a23a25aea5a383e1c9d5ec738d8ac00ab78d4d724c08f6d73eb76c561f0a03660f1efee6be07b20c0903032398ac65aab48bd59a9063978d34095b150bdb8a15be5ed977a11394c15703fac1a7d60faaa3fa8dd8e2b1fd82915c0b77ddb71e0c03635cb753d043cdcb01bd9ab895c1979dae57bfc8f2551ea3d1be58291ef7c413e9ec06d00c6e54a8d7a0ed08cd98ced550689194d0d3fd3f4eafd8b1f471e8ade2cb7c772bf72d876c3347e62cde5c3f9b8c3b5c79bd7d6d5a2732b67576cb6d8b27166a80573b8e95dd3dd83e14b81fcca624936e6fe5fe917949ddf9fd86b2448171e23f1d5934b8f851f51873468b825c10cd41053758d6b6e22479bbd0f46f1e15c40f89dbc0cfbc088b9a0c8f725501b37a50d051681842b99e7f3259872f55dd4af03ac41291373541cce599d421d311c5d0f0597931c5cb2559382ccf43e10726fe907a02f5a2ee73ed5f1b9f25111d0086b208e48ec63d4cbdbe5f98f8c2a4968ea8d1152ee7e214c622cf7df109fd4e8e8a01e4da1ff7d2a61dacb0e0f8d235299f085ff78cb8595769205ddbed41819f02bded4563a747cfa10b7f21bedfe16c7adb634c9ad22e94d53734f9b7e49fba43399429e0550faf1fe80faffa19a85e38e3cda8557c284cb78987163bfa3b598487e42754f0c4fc11e7c41cd6fca3769f66e0de13e6cb92a2b011ade4c9d9705572cd057cbdc03e2705b489fa8909ab2b139b4368ed7adba68aada66f60f5603f8fa0d38ddb79a737f6849834477b12a5f0dffbe624e023922c8247526d58f57fbbc1ae985daaca88b18867445820119baf0fdd5d260083987f7a834b582b01b0ab795d0b8134c32adfe715ddd8cab99b359e5305f5eb92e7dd0522245471e6bf247aa9bc530f06c2e799b2288a77b116abdc17e1d1451066b8d12001315b389ee3eae16522ca87a8a122a6c9066424db228be7375850b64efd65df02fb893548b1dc114ae8e3e7906e8b6093523f5867ba8b9e1d40c601fce90cae349f4a2cb3fb84e62f4dbeca0103fd4dbcdd98261c9b08b19cbc73c1da9c335b363dbb9be11e39a4e9817b1e749727750d89fc7179d2c4996641e1d006556b8d85b77d64dd41b925384737a46fbb530a8303984379b3af4000274f232e615eaa15886181f6301a658e31e44b78cdbc273fad735cb22fd8e0ad0aa963ed390d93813ccf3dc81274579c58d347b919ab40a758191c99ffbf86e6c3292c1727c1bcff823775d6414fc555008bf1285fcdf48ea3cc7de01807a93fda5cab992b7666ee3c63bb976535a0855784d6708be38b66ac60380860d7f0b89d1b02b54499a664e6e654737a5054d0d9883aeccfe3c7c4c5ef731202dbc5b3f4c4fab826725da5f1ade5d113e1984136ad6da1d9bbbd2e411a53402f4befe3cc3eb227623dca579e8a8391e7da306db9da28bfe35c52a7b88728af3392472ee423be6e1ae4528c2777cfd8534bc275c186b23a0cf86f7e84885c310a5f270411
		//String key="a84e3071dbd59dc84ddf9338e89c50ba657252184d10e6949c30647e41ce19c277e484f8334970167230211cfbd7c2be8c0a99712eb8c75a3ac68d734be9dfe1984ae8f0f40dfaf03dbc715d1568f7ac5207062f175be1df974cb23feac6bd69bfde50230a810a3ae38788e1193a93e029544316204f8d913c11ddd967a8e01713c87fe007c37c03ade434a88df4eb4a7c10add42f80d7823a6b1926a77fb40dd518df466ded7a6456f99ad6d6c72fddb21dcf26e788077841eb98b3265d996e51e5dd32200094dc0b996b49c1868e6152e3643d1e1a393faccef5d9ed9b013f347185a7ff7615d5c62097ac42cd6f06250966e2ac122510b78d8762dc67110e18b0573824a85f4981292cb6ff7002ddcd88384ebb8e439e694b147aa1c4898b3fb4c4af7b66dfee4e2b814366170f0f11d1b1df228b5cd459e7bab4ddfa3458d5c7ad3d4c90d65a4587d5b69c794c09a3ecd4c65740bd7bf95fcd77fcf0d1c372b36dd44a7dae655c74914b2df03dfb86c1e52f196b1ef918bf751304e93e456f347b86c8c3a3b3a3e1f40dfa54b5640fc1f2cba2299bcc1d3bf46601e6d1474ca9ee302b3de57b5d55645c510dd4ffb27695c4a6999cedc5bf15332ca6f4ae12f903bc63362d31810c18dd9e3d854b3d1b2e0d8c7fae4573adb57a36e681cb385ccc52054229814bba56ba34d1c9de82d6795d4afbd645848fe87febbdb784f26bacf0217750738223a79617386a24c7474130f68da5125cdd5ad92278f9aa20f4ca3435330d6447b3b4826767ccae96b00d55b6bf65c949a1e932b63079caeff79f0c570b0284ad01976c6a53028852c7b1b753496dfa207efedda5a408c3523b5c01ecd61b20a2576ae351c1561c35b9b34c8d9938532cb060ca5259a1ed808ea9dfb1bdef975c8dbe498923f481abe5f32578553263c61ede08620d70683b0de30a228fdcb393bb1ee5cf0467a920da63d22af2194001c6ea0d6ea2d3da8b32481327b24d8124a48e0f8c0bcf10e413d5d9e0d146537a293574e6a573409d518ee7d7516a6eac829216e7adc8b5f1e7a50d0ef9253e12d40172751b14d1d933e540a0e342b39f2cc07b670cf10d31c918f9b31ba06cc784c5ed89fce257f5c382943bad6a77cf2b379b4b1ce36dadb6550adc48e9bc911170b418d6073a2d6a3441f03106c67a49cb1473baa82affbc5db4ba4467ffbf6a772b0183b5fa6cdebf40f3064e54af234488ed0b4e7848eb33224756bacd423e3406b0c8b40794179b91ea2bc7c966ad0cacc6c4959602148ad61c97ec4efd06c2506e87757fba0918cc9dc70542bc51cab744062472ee8460b83ede43141b51286e0606fca7b0922e6965a23ee06338f4c45e1d5f029ca679fef37febbc7d3486b0b34cc3c294eda6ed88c50679ddb375f25df7498d04a274b920a41637b69086729092cb7429aa0d6328365f365b5ef3c282a753f6d23dba58b663e9c317362be68b9ccfd94799fd3908859325b13db4a57cf605fd84e88ee9b090eefeca66b7a8d21ecb994e3d374c581d28fb0cb6a2278b19fce14f95975af57f77a09b1b2140ded7f9474d1880eede6ed89391908ac05dc8850b1015891d061795422e0560f96d45a762bc8051d3532cd9ef90bf7821c9f6d4b8ca62026556c0800baeb72865d19b14ca22232fcf8e7045fecb36b7350056e83c6d22c35dbe25721a8da202326801f9fe7a6245b640cafa0c7a088bbaef2d44401cbcdca0a5db452fc67243fe45facfe10020ff18d73592bbbd26a25de6d18c77f8e42b9ba5eb07d7799cfcae3dc71f3bd417c59cd2e6b4163ea3d1d0a65fb9a3d965bb70cd34cf6f4ae32332a8654dd2aa2966cfadcbde4d39988cf3913fedf77327ee2804345ffcdf51f5fbeb19077ef85d4f82df8a37ebb25fc4209f139b1c1d1a99821ccf0f7de127f4ef55ca58748402cf90363b6f1cd98c107784ff892cc52fcad10a0bbf29d41b06444de42ce74961c1362914d17acf93bbf5edf307e0f1bf76d0bf740819c06cf6126bca4611b9b2d0e5573e8c9eaa2f4c7bc1a043aeb5822952ce65ea689b66f140934afc26f4b3b3a1a6beffe74e9228481830038673dafcba1db36401af1fc08588b02a65245be851b3d792504e0c06b5d2f61a14ba38cc3d5494f7beef20abfdfea461bb82329e334111fb5f1ee5abf568b72763035ebcc397182303da02bed9b5a5b713b615f4d04ad1a8f8a4c7044f3e4b059182f378ee578bc279f3874d7eaea1138dfce810f94e81c3ebd85a463fad4ae28ec396d40004100af7643bcb9e033a5b26d21325cfce5381c84c67b6c83fc15e36b80cc9fa43b187f567e12b9e6814307f073fd8a7d3a08f6280140ec71595336e3779a5fa82e0835fa455e9c6874c97d742ac7e9581fea364bd7e7a33d3959daaab531be4aa5700701ea30c4c211f3edcad788bbbd9d8f94f7ac9c9b96a948e41b2fc66cd2b802a721c29433d60cdb9da0c3eb99123095db6ef41ef5c4c38dee1e79485db5319b9cbaf05b0723d148fd34651ff7d14d428c5cfa23df3ce74c91294282d14ca518d289305a5a4f7163089436c4c506d482f42e6f7e9dcd820624478c9e31560a9d0374524e89504cb2c8ebd9a4fe3b1d87e2fa3b9b75f6a63737af3b770e331beb82e2f82af967c3cfdbc1e983f7bd943db812f7aeedeaa9456261c3245ae729289bc6a6717522c354b56408860514023c148650a0cb2c0dda27c35a055db3351ccd465d6992dc05d3e1ecb058063ac21efe68534bc696f40c2d6a2251faa2fafd2c3febcd6145477d2b04e86e159613d8299947aa1de4ea530777b4f459d77f460755dde1caad61d2169d413d080ab522a796f10b124a5abc310727af48378635fdef3525f9ad2fa6bc5f19f024057bc99680ffd5218bca3a3488b9e33f51219a30d138a2388d0ccabf21a29a8b2cd16003965a00c4e32150093c6130e868a4a2cdd49758819da8963464c4dd3c7bdf0e2506b39c8c4c447a509bdd03072b491718b647549ef829c84517e25ce2855373ca80c9362ae0f6985b879c06ed661a96cd390d733c79e74f4460107705f092b88d288273fa18087f175cc56208d6d35c12a347c63ccf1a1f693af7d1a2becc2ed23c0b6331670c2037e047169ed91a8e41f2cc1c1837e8752ca2aae3cf8eaad92d3e5ab4d3c3918b3e67a7ecb7000d1e5e2413797e0e49930a7bfcdd90e9b81b79ee356c02167478f0b71e20622617a9f630fb10deec289473ee3f0f7d3e1a4611b4ffb0f374f9e2714c7b9f07fd37e9cfebef99e5cc340cd79f8eb74c0670306de0d758a1d5a8d81e3fc669383e22715f1d2923b8b92bc2b8d32ff1415a677b053551005b45f16fda627602214cde1330178e246cf8012f83618ca7f41711e043f50742d4fd9511107a238e9aa81d3bb2cac2f30654d8c4f5ad380618f53038959d6593772525f4eb24d4502a0e1bc278a22fca0066a5c4debdae6c809c1b1232138b91620d3a5c0e02698dc8291c229604058b567fcc2bd5ef5a5338b74a1c562a55ae54590be2d4340f468ee0d5d2d9a1d20306fd54b66a9a2ce9e9e16a1ed5bd676ce5d6d69bd0fade5d4ba8208802383bc4eaf75eb008b47f7328259c4faae83bb805440e31efa1d84433202e41327129f6481bb1413533defb9bb6e0e4787b7b960252e8a82dc595d11a03eacacdc9ba5ded3f4403d0b2da47cafc98fa8a51a4badc98836b700926f784ac736ec53ddb0b0f2533ec86fcde6fca0e01e66caf2e28c9a975e4d4c104c0bdd0342b4d14dd9095fc071397468757075a4560a8125050d679445c3c522507ba8888b6d398aa6eba438f07fe68b32ae0b5788c27f164fc22c1bfdadd8e4c7b95d4bef48445d2fc41fc1c5adcd63eb481d9935d4831a216666327f01d4d46321d1e01b2cc6e17b72419d35d32c631c5607f665e2d90e9b2ef586345d0010cf79f9e2008c6b0e7b7204dceb13c58c601040dd6fb9992435ae72144f9c13673305cb4c052800bd0303a434ce982a99e12a66ae9b9abe0927ea54e07bdcb6963476923814cad79b579a8f1deca5c25c74e3775450b4855963892825b3c5dd075d024fd5cfcb264af2eee734a7f6556e8f220271ec909b82027718502ca749d468e4125a6585f286a4dc9a781b167e8b4600b96d9c0a997fab097ce6ccff51d9070577e1a961b1ae4e6b1efc5fb85f3c21897faa6526714b148a8edeaab11aba0fd4320320c01d7c299240e0e7bcfd19268b3c4498a7e48930cde385700b484c10244feb676481ea59d88f4f5a6d305bdcc51211dcb8ecdd853033d11875ce553dd9d9531485de337fc23d58b63889f6b8ba0946760bec440efd152d1021d396ccdf94cd088279d9b36263fa8dc444b7ab682636f286bbc562a56d8fce9f51ede5b6c866a364027a5dee42619e74557561e9ba6e2dc237af38a8cfc826ac6e8a636be505df04b36c498e7fa23eeafa9c8d840683b2af26b9bbc67b4f9f5b8b05a479e735b307d58d0901aff0f7919a9ffe9a348415b85edcf64c0e14b05f3c5a1e75fe43f4f6dfd551e64ebc0c1d574f07ed0a2b0f0a5ac4b39c87af1615e1dd3eb3b1caa0b9e9435796a64d260f6875975fab7a4488ae3ae7b076003bd6fba874e3cb1c94f703304d3116042f18d754e47b510d76cd6697815b5af807fa81c8fdd42cfa3c9c75dc73ceb3e94565148128adc004245efa56dde4b435993e4a0fea188f4a6739fc19caa8938ba9a8970f9f53ace8ca73df24afbe6f8db7ce677d43293192a18543e88436ba2566d01cd7ab194211672ce6ed019e16dabb10835ddbff2b329cfa7edf0173ebfa1fbd24c0976db895be1d27e41c79707f51732b39ccfba7146ac2509569bf8153f78eb57b3a47d2983a0478d820aa5088400908fa2f8c05c97af4bf85659968a39e18b281e21981d69ad2a69783786b9528109d57163a6b6fbd61ad44c654167c953f71622467ee5d53347c20f6783969887722533afe52ed576c8769aaf50bc5a513faeff17b4a5994120e1e062aa5a7817886d23a6f135c4fc24f602df8e8086301c74e4d3310067b7c6786fdffe85d5266de77a8f4db37436165af47a0c82c1aca8fd22889b85daed336fe3a9d7f2a45235936375a29d5dce105f25d572ffd8e5c9b2e4a31b7cb8c1493d8831a3cf1a9ca951dfa80191513ef12fa78bdb69ec1df57abcdcde627f9921a713ba265fd7c35ba79c722fac3c829c533f585e7b728318d10180abf67454cc121423b8d185f24f5281b20c66e459f20f1e49830037d0c1561edf9d508ab2d47a63d8892fc2fa6eb39be4fe31418892e8fa8d4abcfa218e4bad07802f5295b48c4465e6e5d89be18e2d4acb87e299d8afa03edd24da5e56bd7ccff7fff9eec6dcdc3892994d05149fda9293d6d08609781d478ef5af679cbe80d166755158d2b96d72df2567ce45c0970beae03a8f5af4444ecffa7d54efc10dbe8504a9be941beb9d9a99df1137eba57d18ce0aa0e24eda715e782d27374ec0e14e1d9ea38d0f0ad098865b51c29fd46bf5981e1287f3847b1537f0ac7e349c87f06fbdaec7033acf7b4ec03e730017b60bf9f4f40e6eaa8328e6574a754f7d06ba4338c928fd1a131957adaeb49b478b9a1e2a1b6d5e504075dd3c9a3fdf50219ae5df0c15002fe145fb6850487dcae5e0335ef769c63d167c5447378649bb9d1aaf7cad931a380693cefac21f44ccee6a542e1c27af0b97b8b986316e07151a7a7acff7efad98474ba6aaf10a2b07b17c1fa9768a248391f256944fe55963a94637fb907b592c5436231003028ba90da89af434b2306ec1f37ad943f272e39be9a327e508b49c7d115fa57b305e426aa2b2898020bfcf4e84f8b977b713df1f4658d2d0bac065a15eb6480091d7aa8b57436f83c569493db66336ac31ed211cdb9db9e7f93ed31ae035a3d2683103b2a2e763bff09f3e9a26d8aee404fb08f1a559b4e894a2e34f1e8994e33143cd9212f873486c03b9a9a133d01f26553ef2688f79f25d6f8d3e3651cb62e9484243a3e31901f254ca9d522a09d03183f09568016013142e9a4256a9ed374dc38e1318c2012d4dd923fc03b7dae9d4970003bee71b9cca8224e867a07b5410ce25e5668868e8edc8f3f45badb1d4c8e115c6376247b9bdc40d5a966db66204d8d4834a3141c608984d5feea11921c0eb4a79d9492f769a79f229ef533f0bd2a092be502a3977872c16e23c0f7cc8431d9206f693f3d9257b788dc413771c4bdd650714fe56be8ef37e009ae77b9d8f0e1613abd7edb0df2be34d0b8bb4fd3d751d0dd9c92083a00b0e4ea6bd0042e792587fb7a21c435de8dbdb60d1bf0efe2d842b73c9769f66e279f7d7c9c7467b7f2b3be7d02a88ab816a20f3801bbbda7708bb8368a0f4f6eb5464927b26ede0f0bac7c90068ad24b58a1e8028ed1ea5cec59950d27cc707e881006a9a4072b15dfce26d56f19f0dd8ade56c7080ab0f805b7da549583f97f0a61938427760f24ee634e784037331799cb963368d2eee93ca4d9f70f6cb838c7e447442117498ffd7826ddae2fad2fee7703886524e14a31b2fcf3fe3e91834c542f8886fa6457e6d2efaa60d466b0bdc6557c4949e13510a0c21ed5b5cf0edd959dd742b3d042f87670a6d5de793dce9b08542b87df5a5d140261d0edb839daba49ac98228939ffece1c9179514b8b439f908ffac60d22d9b8fb5c19cce9fe74d49f19145a0f3b56305d2f269449715c2443243db8bc334144542aaaa45eeb9b5d8f546eaf03124045422cb32c6d1ef7024350e1daba1de89db9bb0ba6c50c00d5340b48a3ab3da25b9ca9f22e9a58ef271f9fd03d1ab9097c12e6f7cc8871c6878557226ebf34d5c61c570b4dafe0292d62f65b51eec99038f8c58fa980bfdc6d5438e1a54e2882c8d242b27e6eed9413d2fc39553bf830d212994c32ca762e2b47194f81e7ed62dc69565155814c542dd3d5fb184f92a8667ffaa4bea3f877432465244798f6da9960d7c3916b6549e1a0a8f9566c7112db1dbc0aa95d3837915bc80a23bcf7206b333d37c4405ff53b73d9657b58a421b3ae1cea86d035e49d7cb8915140ed6f807371bd76ed855a3abd35b61300e3f054551d6e9fbb82ae6e2338b41bac06b91885dd6610ce58eb160453ab25d25dad0838470b3a00ceb9f01b8467350d51b277cd62c3d361c821a11a4c4f578f3e74d14ff438a236ada86fbdc97f45dac65fe782e3e62d7b2e14bbc1ce7415821d608e83fc40bc1cca5d76dcb2d707d080b3e6e124c76b4de611d71d9d4ea65d6de69d7cc85f1d6fc1332ddf04552ef832b303d0939ae387e1a5a7e545528f59c90e4d79b5e0e3b7328e61079c21afd26021adf0cd3e3f3d9902c47745d4bec420795fa4f1df273fe19e9e6152018665201e90a9fe9717e66934ed88dc405f83ccf0f2ff5e916799387b336cd347d81cc96a02fd6332362b85f03ef75bbeac9df7f54eb18871e7bf148398d2d1ac44656ea27eb432184eed910dcfae7160049a9512aea0acf8a9d7df737e133ef4d28afc603547d7d5b9e7b5d2bf1df674fc28c68a3cb343866b332ae29bfd1204f0a2ebf0f8ee70b3415dc295690448842e71dbac5e791b67474a6c9c2386e6c3a5c5062dfbf6f9cf411101bceb810649c9eb39f37d80bc0a15ffad994917aa36d252fe20d9010f5c3d34c52febb3c4ee663d818d4d4636662263f23b07240015d077793746141f3a8040d1c552b2cd6785b94e6f9b4b6a779e3dfa209e96f743b5d06d80b8f422ad15081acd94744a5d633ed5f1b602444d0c9cc8f695bf693f37d06789d7e555c0d38370aad392cbed40cacde69edda72f7f7c5b9a7153d873ac7c1571f66d76a2628a3e4b34b83bb8235f915730c744e4d15118cf144667f407be374962254441be357d61fe9d92958d73fabaa3f0e0531c867e5ff29156af2f7640318fdf594b2240b2c1bc332416e3b7e04ace2cf053ed5397577da6b86531c9dced9eac03e3e510a6c36544ada4c1feae78a6c2db10267dd9537a09636d7d95d198cb4f800af7ab5c6875c4ceea739c72bab9d27c03f59af14d2263bdd0d4ff2c805c92236bfaf93974c63dcbd9f7184860e0aca464bbe41f0c5686bbd61553c08ab3e00be121cf9af10c0ae2acb5ee30131420f71a4fbb96f700f93658e1fd7eaeccf4e9f5ce32257e635e214b6b68e789cd6c3fc7915752b49b4b1260a675b3ce62000c5c8450f2284cf3743a43456d89b890260f1b3938120d228c429426966aba12bbdf5139fb806a32ab30f630112454789ae3c0bbc2c660dc8de9b29105f7df3543673783a6941174f4db2325f8fada8b423655a81a6bb66807794b5ae12768902a3a92998bf8e41bd7beac05cb04528a7b1e1cabecd911e417fb4d6ad8bf688017d4b4012c931cb5b903e4a0ed787d988ee16d6ec83aa58cc4c543fca3dc4973467c58725f56920c00320a868fd6df39f72dc678a2938b6c1850cf6d59d7df6fcbea906e97ba3573a9541082c6f17a8f1fd1ef6e1b4ecf6a149412ad297d1a9c105cb0b44b1f4495748ba85eaadf3163d5dc97071a6582f35ce45259e1ce1cd67be859a7b65025aeb72f0958534611a305aa7d867f58bded40a8bb3f85c58747766dd11b60bb91a6c61cdb61a08fc2020533681e69c75554e5e72f3c42c434ac0d0700f72288b93e6bf4f7bf0b675488b208cbdf25f9f8233996861c136394b9f28c6209bcb3f8ae5d01636e6ab98423ff1efb119ed7ba83f5d9018e862f6dd57286d421c24620a748b2e727618b17b6f57178b8e68cea2998aa4f631b9dde91ed66fad6e8d0b8285dbdc5848b0c8bfbcdc9e22a6b25c151b8439bfa2b356c25ba7c5244adc875c8fb33252c95625a76523d8f38699e4a2994564bd403c66389764ecec69a9be711c39a9098933c7b9eae9855b01b4087ca87d87079c404baf409ae0c7609122a2f49b707de82ade95e89b0d80a08346c0099ae32e4d4018e45880df40173fa7dd33e56916bcb643dacf8d3ebfd27588a95fb3cba1c00d52a3ba6a8a4dfcfab02b896a262848d22ef2e79181081a61a3fa1a35ed6fe647cf23431834ce1da2b677623a1fe26e8561dbd10f0ba4f64ad49ded1351b9cf9e50ac7ddce2ccf784a5be629f65f72e13f632b63d035c7026e0217f1850f8b7ed2a17a02b200000ce855b8b14e66ac6798a9930b3a1e3d12cf7d207d79d7465056bd1ad85d53b890ee00d9d7e43144dc62fba7aad30881719d2f0159bfc3b70db26b6f19dd88efaacc02f3dc489872eaf4d1611892a552e163a3fb8063cd255c8648862ece2ee0cc3f19fa093ccbb32afbc52e3ef97d02e685d950f9468364f2b23d923b9d3e0aca0ba4c8325001a89db9eec401d4e25263e12d7506408cbe1bb3e090c3a78ec88ec1d5934f720980d8a1f135c8a367a0880806c159f9b4bcf52013c293c2a2b45bbb0e5b6f162fa46537c1b3d0876225b1cd99d5d91cf60b8156d6f310b96ecd26d86df47ebc5fb40a08a2162a3821f7cac17a3bed7fb21e3f8f38a57f4e94481b1a4be13ee99d81dfd18af8cf8f930bc5178a648ede1f4975dab2a97e434b6014340f4de3b1685bc711d2e1842e3e63f7eb78f469271e926beda41e8eb535476e42d3d81d80938c5f736dd37eece0019b867d34de1db9787f6afbc67dbcf8ed7f831b7b87f42954b6fc734c1fa4cabb9634fdeb8bc6987c89c0c0e9aecbaf1cfeeb67f006ac1cce6b283243f4c79ec1eabd51a00cf9a2e45aebea61b7bb0e41747a4fefd5e4e1f903ad7e1472ee1e1bf5857f63274a5dec874bb74abe10883428582634c738a93f4ff92f138a572c89180a28bb5953125d523f0d3bf50888a66470aba7fd7e3adf931aa9297026c788b1cc20df010fbc43eb22e360fa62510043b896406e90f7e4724a5390d56d21acb964144f48b3f428c8a81c149acfea82455877c3d40112dcf2c221a8fd6d10cdfd938b559a58cbece9c40e43a9a916233d749986c5ba3ab6131f98aed270f1b046577f229315a7c5bc7738b2c49d5c6798dff55052d46424ddad10dbeba8f35395e9e62c07459ea3dc8c2e031cb20b420289955412bcba6a3cdcf261ce745846280654403fc05ddb2bf091927729d7f9fe63adb7f35f3e6dcd5051fdfca7b32d128ababd3bde0c0555da3489af8a30556683f774b4723eeac45aa856a6f1efb664e845460d9570111e76ba71d827ef3caa2df257bf438b3296631b5c1deec5b0811b80397649fbcc3af7f6de9eabe5ac6b3fdd38b0169a20b06d51731de90f1c63a5a30a420587fb4b325f3604658c06ea88233a14d66d453804f2938cf75f44e22e82a898757afaea2ff552abc50220370c7f1fc5cce154f9489575966124dfff04848eebe085796d758c25ac85c623c1f88b68c396d947169c7cad92f501d1b0f28ba096732efc624452f0083de6260cd373c5796fdb1c04eae80abe02fb9f20519237fae7acece9237a625454938ef1b5330ac1e900a6e6fdb7d9b8e27b0a606e6083e98884b44f4f233abf9233bb673cde3cb548d16b3b4f9badaf3785fc98c17156d7e88d9c648f30de535b0587490e3c8d8c3284611675f9d151b6ec6d1fa1b2d712b119ca93ab852be9171ca5888e2446bbec79654d43822527bd5c38e049b38d09b41ec72091981b2df07880d5988ccb49cd6619f99c0775b3179a8862d7c502d988037e6ce78e677e55f7e629a8a0c2d2b4e21f6807e003871397da10b7e5a4edff70150d74210cd2e7b11fa7cd76434a039a2ccf30c8c07da92b359a2935271071da8b74f217365e5d5fa91dce29c3a06b2db555b8ea92018851b6480ea8adbcea393ed0830c803c8b3685567b93476161d535288f3ef22319e72385647646bd59f5b2e1cae16bf50e7824858875d2aa2d38d0029890d60f8624a01862e1f705ab4f5bafd5efa5b88fcee447a1a6f4ab5278db937e53a6927409eb754c643038070b0c0afbbb5754e6de6a84270bf16016f10bdfbbc13d9ea75cc7b612e6ecfbad8524f2339e868d9f44bfc11910ed50abb35cb80f9f3428bc6d7bf643f1d5f258e413acac436063e0705fc66a1bd300e56a38b00ed7d76bf8221663edfaf8f3a8015a67f61c2f32cb4e9fa0db8bcebd2634332184c760636606670c709ba81ed48947f1598f64b7540cfec498362f38e58636a6182de318930b843d5fd09737278a373708e8ec9eb8b01b57880ab0e34b79f98522a3ec520ddb01dc611300c38a723e90c1ba0d70e41b8a34df76e77282a567f83bd4928b7bfd6a9568a5aec96d464884e96b16fbecf719790e31de992786b10f4b52c0d408764a0ce79db793b6f46bd3090167464ff9b4c67fc8f0377fb6a6c5fba0021aa86a8e803e1a681950318a8d1e755b2cecd1ecd9ef467d5ccb091a9362d1da70ac3ebce67b4fa462df74c23fd826449f4155950f170dba82c94fbb4d4b3018508ac4909ca42ea505ea15ad8e15fa4d84ac7a77433c969de3883446c87a06ace0da8cc9737100330fd8c4fd165134d1c90bbec9469334fe9362132addd81a21ce8c803db1eb78e5f59179259f21f986d15841de430fc19c1f82ad2ff55b5f0b766fc265aa7bf1ebacb06622763c694f8c30f907612ecd1bb5281df336a5986b06a51ba2b6f3e8d4266e67a3d8a625a7b7b547fa9db029b6f086baedb1de9d2966384ecbafd474071abbd87d8b020f1d33202ceaea9ba7358d3a1e1530654061de73a25bb5cebefe4d7141f8b67e426a45a778615d4dec9c107cf9c82def5e01d578e6b4c61d9e6d3492235700c8fc9b994077e48b2fe74b22064752b436b8d0b96c50be3bca163bd9ddf371d72a85f507921eed9d61a2e05c3653d8dd3912ebb490b0b55081c9cbb421d29393b91522570d2f3f531895e56beeb002a5a47044256553e42ff6d10e7e5276d972fb314f44531c724de0eabc3c6fa0b608dd4098ecf45b95dfa7163c6d4b2fb41ff5af2f1c95e1fd57c6c262a597c35e46e3ed8b17a84313bb888612b78b77dd40066b40e35804e0ac3e8619738d7f99bd4beca5d0f9de3a3f363205e7df9e13825410d8fa69a9ecdde0374bb9c7f9cd94a41dc184ed1cf81b7fea4b63ebd435ab253fa32386b626d3a84ee599b4585d1f08bde9ecab1049431b3f73083837e503a5f6a050259feff656ed33439f6c61c51695996189a022e64d25602473e8f6a05423b5961f40f6ade3302fa22fb337f278551be5ef14fb6979c96477e440c514fc4b6c0b11963751c585e8c40e93e736fccca78e05dd146aca272c1d9148a9f076ccafacf30290213d0e29fe7456dd9ad1bedae7eaeb6e1eba25863826877e9215fb394e818f7cd1bc55bcf3a56e5732f12e10bb1d5e7b6ecda36d1a8248dd9215471835beace7ab66b79e19325a59978542bfaaa0e1c61109cf3f1420a2c62053d32a0bff65515e8698c59bbd0cbc3054522964bb939d6c81e5b77d8d683b578599e48afd0b169a22a74d8137a7d734cfb0fb28565bb785c1c1a8c2b7f24a550add4f82e0d01d820f024a7aa615ac8c44ff549e5e647ddb4e0be58bd1e89a9fec0d232f316aaf8de63ccb57cd6b0d7431bcd3ba049ed61d5f154efcf5f8a87c41a095fd159b10ea556e7344cc93937f7a1af38bf938330a2fc7e9f28970a415758319ec9e58c4e5c9c5427aa9a880da251b90b79ce8284305281a7d055250dfded4617eada4d36de34ceb4b4d9f23353a66a0faecc2b111ced96484a7942e2797ef2157ed7398860a8f83cfffb8e37b3c2de31d101595c7aa5885a6f808ec25293be8cde95448131b0b81cb8fab47632bb58d88171026cb69a0c3e5f6ccb40a01fccfeacc90a9973d07638b3c3bf0b2906508951c37803281374318d5b75a2b86ba83de00736e30738228c0f640575753843951f554a40ec81c9fb78c19bb5cf47c314faea2961c94b2ea19d29c6f6cfbb10a035843547b62a5c5d6a71c0be4a43cd36bb3adae69035f9987ad930f1928896a485830bcb4c2df173bf9dd0af8d83e75a74696decd6b8e6e6a58e30e286165370580248400185e52e12525616fb9e8f9ef3af78fd79bbb59e4434e11feec7c1006f27cf9dc1976c76294535713633640cf36c28c55131a16e0eb7c45daf2797a6833632dd1f483c40868d14699f69655dd4909fcfe8de7d9ab4d6a8843fc94dbb806e9772685e1cb106519a6707a50367a4381dc87d28f3f7727781bd76340d2d52d084c4731c92ddf373e562bd8794b4b404c209b170bf2a2c54ad127f99ad55f4a337c68b581c026a3cb4cab521b3dce811f204e9cb4d9b58203e78e0dc659950cd6f5a8df319c8a82ee09fb285372e237572eb1c569614a98ec301dd06b869029f027433f66a1279553f7d6195e92a8461a9d28d38f1f87e042c5ffdf3565b2f8a54ad2413399979f78a1b32d08db2d8801adcc91907d66d6a545e1d5665b6cd48939cb9fd8223b80c6d40c6038e3be343aff6175b68efdfe7fd33ec75de317749ecf63e060436c7cd637dfcfd3a1ceb309cf2940ae976d23b197e97754e76156f6ae95ac4bdbe4f591ec2f6fa279e872c6e5c0089626244cff6bcfee82acbd4edd986686ab84ccde94e62d10036c10ce5d2204564578d4a6fb4a2a6d83e29300a82f17a412fcbba943b415577be671aa1d0a60e52a6e75266e797e7ab60bfc8db66f829e20fdb209b24184b1a5f3f71c2e3b827d2cd8207ba03df2fb4c432be6891806eea1e3ae359f50d4aeff807bed285a291360e2dfcd9acc1951e4486301737be003b22f00505659b0132bbf6aae406e853c2b9515b13949f36e642fcc863a2aa982461104ee6fc78441f805c8a4a0e96126ba97c313057271afd25e208100b2d0a50378040a9f98e99fde0a76b80054995cd22f8da12fb553bb65bdf938663b67bc634ba6ac8670aac7c1beced5aa15e4da4270f6770c82d233eb1194a9d925e90af5d6a169a390450c995e97750abd1664ef1a9149902218983cdc3b2761e6c77d0b3087ee147a52093f8e854cd8d5b9270e752e98e0c0262d349531390c64948639114de81b2a64ab9f08d321979129d7f91838fd697a58ed2587c1df418c99c8563123d73bed84daea5224c50a1713cf5fa039870bd357c2dcbc3d05308dc90dd9084cd04de5069d19a04ae91cf5b4e8f3247f2e7b4a7b2d79fa171d8be70af3ed1c1c46e1fc883bb27947c836121370523a003acc15430bbfc61037ff9fc37ef541d318fa662f588f84505c0ac1d83b3c4f48f6d9eb847bb5f90ed4894aefee123a9b45b38876e654737a5054d0d9883aeccfe3c7c4c5ef731202dbc5b3f4c4fab826725da5f1ade5d113e1984136ad6da1d9bbbd2e411a53402f4befe3cc3eb227623dca579e8a8391e7da306db9da28bfe35c52a7b88728af3392472ee423be6e1ae4528c278629afc2620c477717b35bf2fed84ff9c817c934173ea5e2";
		//System.out.println(key);//bc-d1-77-fb-79-1e
		//System.out.println(Yz.getLicense(key));
	}
	
	
	
}
